package net.cyndeline.scalarlib.rldungeon.dgs.strategy.pointlessArea.help

import scalax.collection.immutable.Graph
import net.cyndeline.scalarlib.rldungeon.dgs.graph.{DGSFunctionality, Room}
import scala.reflect.runtime.universe._
import scala.reflect._
import scalax.collection.GraphEdge.UnDiEdge
import scalax.collection.GraphPredef.OuterEdge
import net.cyndeline.scalarlib.rldungeon.dgs.strategy.help.{CollapsedEdge, CollapsedNode}

/**
 * Container for graph-related data, lowering the amount of parameters that must be sent to the strategy.
 *
 * @constructor Wraps a set of graph-related parameters into a common container.
 * @param initialGraph The graph that should be modified.
 * @param cycleCollapsedGraph Cycle-collapsed version of the initial graph, where every vertex is represented by
 *                            a collapsed node.
 * @param start Start vertex in the initial graph.
 * @param goal Stop vertex in the initial graph.
 */
case class StrategyGraphData[VType <: Room[VType]: ClassTag : TypeTag, EType[X] <: UnDiEdge[X] with DGSFunctionality[X, EType] with OuterEdge[X, EType]]
  (initialGraph: Graph[VType, EType],
   cycleCollapsedGraph: Graph[CollapsedNode[VType], CollapsedEdge[VType]#Inner],
   start: VType,
   goal: VType)
